// 时间格式处理
export const formatDate = (date, format) => {
  if (/(y+)/.test(format)) {
    format = format.replace(RegExp.$1, (date.getFullYear() + '').substring(4 - RegExp.$1.length))
  }
  let o = {
    'M+': date.getMonth() + 1,
    'd+': date.getDate(),
    'h+': date.getHours(),
    'm+': date.getMinutes(),
    's+': date.getSeconds()
  }
  for (let k in o) {
    let reg = new RegExp(`(${k})`)
    if (reg.test(format)) {
      let str = o[k] + ''
      format = format.replace(RegExp.$1, (RegExp.$1.length === 1) ? str : tool.addZero(str))
    }
  }
  return format
}

// 滚动监听
export const wScroll = (callback) => {
  let timer
  function fnScroll() {
    if (timer) {
      clearTimeout(timer)
    }
    timer = setTimeout(() => {
      callback && callback(document.body.scrollTop || document.documentElement.scrollTop)
    }, 10)
  }
  return {
    mount() {
      window.addEventListener('scroll', fnScroll, false)
    },
    unmount() {
      window.removeEventListener('scroll', fnScroll, false)
    }
  }
}

// localStorage
export const storage = {
  get(key) {
    return JSON.parse(localStorage.getItem(key))
  },
  set(key, value) {
    localStorage.setItem(key, JSON.stringify(value))
  },
  remove(key) {
    localStorage.removeItem(key)
  },
  clear() {
    localStorage.clear()
  }
}

// sessionStorage
export const session = {
  get(key) {
    return JSON.parse(sessionStorage.getItem(key))
  },
  set(key, value) {
    sessionStorage.setItem(key, JSON.stringify(value))
  },
  remove(key) {
    sessionStorage.removeItem(key)
  },
  clear() {
    sessionStorage.clear()
  }
}

// cookie操作
export const cookie = {
  get(key) {
    let arr = []
    let reg = new RegExp('(^| )' + key + '=([^;]*)(;|$)')

    // 如果获取到cookie，则直接返回数据
    if (arr == document.cookie.match(reg)) {
      return unescape(arr[2])
    }
    return null
  },
  set(key, value, time) {
    let Days = 30
    let exp = new Date()
    exp.setTime(exp.getTime() + Days * 24 * 60 * 60 * 1000)
    document.cookie = key + '=' + escape(value) + ';expires=' + exp.toGMTString()
  },
  remove(key) {
    let exp = new Date()
    exp.setTime(exp.getTime() - 1)
    let cval = cookie.get(key)
    if (cval) {
      document.cookie = name + '=' + cval + ';expires=' + exp.toGMTString()
    }
  }
}

// 字符串验证
export const verify = {
  isPhone(value) {
    return /(^1[0-9]{10}$)/.test(value)
  },
  isPassword(value) {
    return /^\w{6,16}$/.test(value)
  },
  isNull(value) {
    return value.length
  }
}

// 页面滚动方法
export const windowScroll = {
  callback: [],
  // 初始化页面滚动事件
  init() {
    // 如果设置了滚动事件，则不操作
    if (window.onscroll) {
      return
    }

    // 设置滚动事件
    window.onscroll = () => {
      return this.callback.forEach((fn) => { fn() })
    }
  },
  // 销毁滚动事件
  destroy() {
    window.onscroll = ''
  },
  // 设置回调方法
  setCallBack(fn) {
    // 如果是方法，则放到回调函数中
    if (typeof fn == 'function') {
      this.callback.push(fn)
    }
  }
}

// 将参数转换成对象
export const parseQueryString = (url) => {
  // 将url转义
  url = decodeURIComponent(url)
  // 匹配的正则
  let regUrl = /^[^\?]+\?([\w\W]+)$/
  let regPara = /([^&=]+)=([\w\W]*?)(&|$)/g
  let arrUrl = regUrl.exec(url)
  let ret = {}
  if (arrUrl && arrUrl[1]) {
    let strPara = arrUrl[1]
    let result
    while ((result = regPara.exec(strPara)) != null) {
      ret[result[1]] = result[2]
    }
  }
  return ret
}

/**
 * 将参数追加到url上去
 *
 * @param { String } url    需要追加的url链接
 * @param { Object } params 需要追加的参数
 */
export const joinQueryParamsToUrl = (url = '', params) => {
  // 将之前的参数截取（不要了）
  let urlPrefix = `${url.split('?')[0]}?`
  // 将参数全部获取
  for (let p in params) {
    urlPrefix += `${p}=${params[p]}&`
  }
  return urlPrefix.substr(0, urlPrefix.length - 1)
}

/**
 * 打开新窗口
 *
 * @param { String } url 链接
 */
export const openWindow = (url) => {
  var a = document.createElement('a') // 创建a对象
  a.setAttribute('href', url)
  a.setAttribute('target', '_blank')
  a.setAttribute('id', 'camnpr')
  document.body.appendChild(a)
  a.click() // 执行当前对象
}

// 方法
export const tool = {
  addZero(str) {
    str = str.toString()
    return ('00' + str).substring(str.length)
  }
}

// 给数组添加has方法
export const inArray = (list, data) => {
  // 如果是待判断的值是数组或对象，则将其转成字符串
  if (typeof data == 'object') {
    data = JSON.stringify(data)
  }

  // 遍历的对象
  let eachObj = ''

  // 遍历数据
  return list.some((v) => {
    eachObj = v
    
    // 如果值是对象或者是数组
    if (typeof v == 'object') {
      eachObj = JSON.stringify(v)
    }

    // 只要有一个值是相等的，则将标志位置为true
    return eachObj == data
  })
}